#define _CRT_SECURE_NO_WARNINGS
#include "main.h"
#include <stdio.h>


/*单链表初始化。初始化成功函数返回0，否则返回1。*/
int ListInitiate(LNode** head) {
	*head = (LNode*)malloc(sizeof(LNode));
	
	if (!(*head)) {
		return 1;
	}
	((*head)->next = NULL);{
		return 0;
	}
}
/* 函数返回由head所表示的单链表的长度。*/
int ListLength(LNode* head) {
	LNode* p = head;
	int size = 0;

	while (p->next != NULL) {
		p = p->next;
		size = size + 1;
	}

	return size;
}

// 在由head所表示的单链表里插入一个元素 x 到位置 i。
// 插入成功函数返回0，否则返回1。
int ListInsert(LNode* head, int i, DataType x) {
	LNode* p = head;
	int j = -1;

	while (p->next != NULL && j < i - 1) {
		p = p->next;
		j = j + 1;
	}

	if (j != i - 1) {
		return 1;
	}

	LNode* q = (LNode*)malloc(sizeof(LNode));

	q->data = x;
	q->next = p->next;
	p->next = q;

	return 0;
}


// 在由head所表示的单链表里删除位置 i 上的元素并将其值存入 x 变量里。调用成功后，列表长度减1。
int ListDelete(LNode* head, int i, DataType* x) {
	LNode* p = head;
	int j = -1;

	while (p->next != NULL && p->next->next != NULL && j < i - 1) {
		p = p->next;
		j = j + 1;
	}

	LNode* q = p->next;

	*x = q->data;
	p->next = p->next->next;

	free(q);
	return 0;
}

// 在由head所表示的单链表里获取位置 i 上的元素并将其值存入 x 变量里。调用成功后，列表长度不变。
int ListGet(LNode* head, int i, DataType* x) {
	LNode* p = head;
	int j = -1;

	while (p->next != NULL && j < i) {
		p = p->next;
		j = j + 1;
	}

	*x = p->data;

	return 0;
}

// 释放所有的由head所表示的单链表里的元素节点（含头结点）。当释放完全成功时，函数返回0，否则返回1。
int Destroy(LNode** head) {
	LNode* p, * q;
	p = *head;

	while (p->next != NULL) {
		q = p;
		p = p->next;
		free(q);
	}

	if (p->next != NULL) {
		return 1;
	}

	*head = NULL;
	return 0;
}

void main(void)
{
	LNode* head;
	int i, x;
	ListInitiate(&head);/*初始化*/
	for (i = 0; i < 10; i++)
	{
		if (ListInsert(head, i, i + 1) == 0) /*插入10个数据元素*/
		{
			printf("错误! \n");
			return;
		}
	}

	if (ListDelete(head, 4, &x) == 0) /*删除数据元素5*/
	{
		printf("错误! \n");
		return;
	}

	for (i = 0; i < ListLength(head); i++)
	{
		if (ListGet(head, i, &x) == 0) /*取元素*/
		{
			printf("错误! \n");
			return;
		}
		else printf("%d    ", x);/*显示数据元素*/
	}

	Destroy(&head);
}
